/**
 * @file LineaRecetaDAO.java
 * @brief Obtiene y actualiza la información de la BD referente a las lineas de recetas.
 *
 * Copyright (C)  - April [2011]
 *
 * @author Francisco Manuel Herrero Pérez
 * @version 01.00
 *
 * @footnote e-mail:  fran.herrero.perez    at gmail.com
 */

package GestorCitas;

import Definiciones.Definiciones;
import Servicios.Conexion;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * @class LineaRecetaDAO
 * @brief Obtiene y actualiza la información de la BD referente a las lineas de recetas.
 */
public class LineaRecetaDAO {
    /**
     * @brief Anade una LineaReceta a la base de datos
     * @param lr LineaReceta a anadir a la base de datos
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static void add(LineaReceta lr) throws SQLException, IOException, ClassNotFoundException {
        DateFormat formato_fecha = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Conexion.conectar();
        Conexion.actualizar("INSERT LineaReceta(observaciones, cada, tiempoCada, fechaInicio,"
                            + "estaCancelada, numTomas, deUn, esParteDe)"
                            + " VALUES (\'"+ lr.getObservaciones()+"\',"
                            + lr.getCada()+","
                            + "\'"+ lr.getTiempoCada().toString().toLowerCase()+"\',"
                            + "\'"+ formato_fecha.format(lr.getFechaInicio())+"\',"
                            + "\'"+ lr.getEstaCancelada()+"\',"
                            + lr.getNumTomas()+","
                            + lr.getIdMedicamento()+","
                            + lr.getIdReceta()+");");
        Conexion.desconectar();
    }
    /**
     * @brief Elimina una lineaReceta de la base de datos
     * @param lr LineaReceta a eliminar de la base de datos
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static void delete(LineaReceta lr) throws SQLException, IOException, ClassNotFoundException {
        lr.cancelar();
        LineaReceta.update(lr);
        //Conexion.conectar();
        //Conexion.actualizar("DELETE FROM LineaReceta WHERE idLinea="+lr.getIdLinea()+";");
        //Conexion.desconectar();
    }
    /**
     * Actualiza una lineaReceta de la base de datos
     * @param lr LineaReceta a actualizar
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static void update(LineaReceta lr) throws SQLException, IOException, ClassNotFoundException {
        Conexion.conectar();
        DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");
        Conexion.actualizar("UPDATE LineaReceta SET observaciones = \'"+ lr.getObservaciones()+"\',"
                            + "cada = "+lr.getCada()+","
                            + "tiempoCada = \'"+ lr.getTiempoCada().toString().toLowerCase()+"\',"
                            + "fechaInicio = \'"+ formatoFecha.format(lr.getFechaInicio())+"\',"
                            + "estaCancelada = \'"+ lr.getEstaCancelada()+"\',"
                            + "numTomas = "+lr.getNumTomas()+","
                            + "deUn = "+lr.getIdMedicamento()+","
                            + "esParteDe = "+lr.getIdReceta()
                            +" WHERE idLinea ="+lr.getIdLinea()+";");
        Conexion.desconectar();
    }
    /**
     * @brief Obtiene la LineaReceta @param id_linea de la base de datos
     * @param id_linea Codigo de la LineaReceta a obtener de la base de datos
     * @return LineaReceta @param id_linea de la base de datos
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static LineaReceta get(int id_linea) throws SQLException, IOException, ClassNotFoundException {
        LineaReceta lr = null;
        Boolean cancelada = false;
        DateFormat formatoFecha = new  SimpleDateFormat("yyyy-MM-dd");

        Conexion.conectar();
        ResultSet tabla = Conexion.consultar("SELECT * FROM LineaReceta WHERE LineaReceta.idLinea = "+ id_linea+";");
        if(tabla.next()) { //Encontrado
            try {
                if(tabla.getString("estaCancelada").equals("True")) cancelada = true;
                lr = new LineaReceta(tabla.getInt("idLinea"), tabla.getString("observaciones"),
                                 tabla.getFloat("cada"), Definiciones.UnidadTiempo.valueOf(tabla.getString("tiempoCada").toUpperCase()),
                                 formatoFecha.parse(tabla.getString("fechaInicio")), cancelada,
                                 tabla.getInt("numTomas"), tabla.getInt("deUn"), tabla.getInt("esParteDe"));
            } catch (ParseException e) {
                    e.printStackTrace();
            }
        }
        Conexion.desconectar();
        return lr;
      
    }
    /**
     * @brief Obtiene una linea receta que concuerde con los argumentos de la base de datos
     * @param id_linea Codigo de identificacion de la linea
     * @param observaciones Observaciones del medico a tener en cuenta para la toma
     * de este medicamento
     * @param cada Periodo de tiempo entre cada dosis
     * @param tiempo_cada Unidad de tiempo entre cada toma
     * @param fecha_inicio Fecha de comienzo del tratamiento
     * @param esta_cancelada Tramiento cancelado o no
     * @param num_tomas Numero de dosis a tomar en el tratamiento
     * @param id_medicamento Codigo del medicamento recetado en esta lineaReceta
     * @param id_receta Codigo de la receta de la que forma parte esta lineaReceta
     * @return LineaReceta 
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static LineaReceta[] get(Integer id_receta, Integer id_medicamento, Date fecha_inicio, 
                                String observaciones, Float cada, Definiciones.UnidadTiempo tiempo_cada,
                                Boolean esta_cancelada, Integer num_tomas)
            throws SQLException, IOException, ClassNotFoundException {

        DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");
        String a_buscar = "";
        boolean cancelada = false;
        ArrayList<LineaReceta> lrs = new ArrayList<LineaReceta>();
        LineaReceta[] lineasReceta = null;

        if(id_receta != null) {
            a_buscar += "esParteDe = "+id_receta;
        }
        if(id_medicamento != null) {
            if(!a_buscar.equals("")) a_buscar += " AND ";
            a_buscar += "deUn = "+id_medicamento;
        }
        if(fecha_inicio != null) {
            if(!a_buscar.equals("")) a_buscar += " AND ";
            a_buscar += "fechaInicio = \'"+formatoFecha.format(fecha_inicio)+"\'";
        }
        if(observaciones != null) {
            if(!a_buscar.equals("")) a_buscar += " AND ";
            a_buscar += "observaciones = \'"+observaciones+"\'";
        }
        if(tiempo_cada != null) {
            if(!a_buscar.equals("")) a_buscar += " AND ";
            a_buscar += "tiempoCada = \'"+tiempo_cada.toString().toLowerCase()+"\'";
        }
        if(cada != null) {
            if(!a_buscar.equals("")) a_buscar += " AND ";
            a_buscar += "cada = "+cada;
        }
        if(esta_cancelada != null) {
            String estado;
            if(esta_cancelada)estado = "True";
            else estado = "False";
            if(!a_buscar.equals("")) a_buscar += " AND ";
            a_buscar += "estaCancelada = \'"+estado+"\'";
        }
        if(num_tomas != null) {
            if(!a_buscar.equals("")) a_buscar += " AND ";
            a_buscar +="numTomas = "+num_tomas;
        }

        ResultSet tabla;
        Conexion.conectar();
        if(!a_buscar.equals("")) tabla = Conexion.consultar("SELECT * FROM LineaReceta WHERE " + a_buscar + ";");
        else tabla = Conexion.consultar("SELECT * FROM LineaReceta");

        while(tabla.next()) {
             try {
                if(tabla.getString("estaCancelada").equals("True")) cancelada = true;
                lrs.add(new LineaReceta(tabla.getInt("idLinea"), tabla.getString("observaciones"),
                                 tabla.getFloat("cada"), Definiciones.UnidadTiempo.valueOf(tabla.getString("tiempoCada").toUpperCase()),
                                 formatoFecha.parse(tabla.getString("fechaInicio")), cancelada,
                                 tabla.getInt("numTomas"), tabla.getInt("deUn"), tabla.getInt("esParteDe")));
            } catch (ParseException e) {
                    e.printStackTrace();
            }
        }

        Conexion.desconectar();
        if(lrs.size() > 0) {
            lineasReceta = new LineaReceta[lrs.size()];
            lrs.toArray(lineasReceta);
        }
        return lineasReceta;

    }

}
